import { bubbleSort } from '@/utils/sort'


/** 日期转换 */
export  function convertDateFormat(date: Date) {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
}

/** 格式化日期 */
export function formatter(type: any, value: any){
  if (type === 'year') {
      return `${value}年`
  }else if (type === 'month') {
      return `${value}月`
  }else if (type === 'day') {
      return `${value}日`
  }
  return value
}

// 根据年、月、日构建 yyyy-mm-dd 格式的字符串，核心是补零处理（确保月、日为两位数字）和格式拼接
export const formatDate = (year:any, month:any, day:any) => 
  `${year}-${(month + '').padStart(2, '0')}-${(day + '').padStart(2, '0')}`;

/** 时间戳转日期 */
export function timestampToDate(timestamp: number){
    // 创建 Date 对象
    const date = new Date(timestamp);
    // 获取年份
    const year = date.getFullYear();
    // 获取月份，注意 getMonth() 返回值是 0 - 11，所以要加 1
    const month = String(date.getMonth() + 1).padStart(2, '0');
    // 获取日期
    const day = String(date.getDate()).padStart(2, '0');
    // 拼接成 年-月-日 格式
    return `${year}-${month}-${day}`;
}

/** 时间戳转时间 */
export function timestampToTime(timestamp: number){
  // 秒级时间戳转毫秒级（关键：乘以 1000）
  const date = new Date(timestamp * 1000);
  // 获取年、月、日（月份从 0 开始，需 +1）
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 补零为两位
  const day = String(date.getDate()).padStart(2, '0');
  
  // 获取时、分、秒（hh 为 12 小时制，HH 为 24 小时制）
  const hour = String(date.getHours()).padStart(2, '0'); // 24小时制，若需12小时制用 getHours() % 12
  const minute = String(date.getMinutes()).padStart(2, '0');
  const second = String(date.getSeconds()).padStart(2, '0');
  
  // 拼接格式
  return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
}

/** 性别转中文 */
export function genderName(gender: number){
  return gender === 0 ? '女' : (gender === 1 ? '男' : '保密')
}

/** 防抖函数 */
export function debounce<T extends (...args: any[]) => any>(
    func: T,
    wait: number,
    immediate: boolean = false
): (...args: Parameters<T>) => ReturnType<T> | undefined {
    let timeout: ReturnType<typeof setTimeout> | null;
    
    return function(this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T> | undefined {
        const context = this;
        const later = () => {
            timeout = null;
            if (!immediate) {
                return func.apply(context, args);
            }
        };
        
        const callNow = immediate && !timeout;
        
        if (timeout) {
            clearTimeout(timeout);
        }
        
        timeout = setTimeout(later, wait);
        
        if (callNow) {
            return func.apply(context, args);
        }
        
        return undefined;
    };
}

/** 对象转Map */
export function objectToMap(obj: { [key: string]: any }){
    const map: Map<string, any> = new Map();
    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            map.set(key, obj[key]);
        }
    }
    return map;
}

// 将数组[1，2，3，4，5] 转换 周一 周二 周三 周四 周五
export function toWeekStr(weeks: number[]){
	bubbleSort(weeks)
	return weeks.map( (week) => {
        return `周${['一', '二', '三', '四', '五', '六', '日'][week - 1]}`;
    }).join('、');
}

// 字符串转数字
export function strToNum(arr: any[]){
  return arr.map(Number)
}

// 将数组[1，2，3，4，5] 转换 1日 2日 3日 4日 5日
export function toStr(days: number[], unit:string){
	bubbleSort(days)
	return days.map( (day) => {
        return `${day}${unit}`;
    }).join('、');
}

/** 延迟执行某个方法 */
export function timeout(fn:()=>void, duration: number = 500){
  setTimeout(()=>{fn()}, duration)
}